﻿using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
using Microsoft.VisualBasic;

namespace 凯旋归来管理端
{
    public partial class Main : Form
    {
        string key = DateTime.Now.Year.ToString() + "年" + DateTime.Now.Month.ToString() + "月" + DateTime.Now.Day.ToString() + "日";
        string connectStr = "server=localhost;port=3306;database=czhenya01;user=root;password=123456;";
        string AppName = "凯旋归来服务端";
        models.物品列表[] m_物品列表;
        models.物品信息[] m_物品信息;
        models.附加属性信息[] m_附加属性信息;
        models.NPC列表[] m_NPC列表;
        models.怪物掉宝[] m_怪物掉宝;
        models.技能信息[] m_技能信息;
        Dictionary<string, int> m_基础属性;

        public Main()
        {
            InitializeComponent();
        }

        private void lb物品列表_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lb物品列表.SelectedIndex == -1) return;
            string 物品名称 = lb物品列表.Text.Split('\t')[0];
            models.物品列表 物品 = null;
            for(int i=0;i<m_物品列表.Length;i++)
            {
                物品 = m_物品列表[i];
                if (物品.中文名称 == 物品名称)
                {
                    break;
                }
            }
            for(int i = 0; i < m_物品信息.Length; i++)
            {
                models.物品信息 物品信息 = m_物品信息[i];
                if (物品信息.Id==物品.信息ID)
                {
                    cmb参考物品列表.SelectedIndex = i;
                    break;
                }
            }
            //开始输出物品信息
            txt物品中文名称.Text = 物品.中文名称;
            txt物品倍率.Text = 物品.物品倍率.ToString();
            txt物品售价.Text = 物品.售价.ToString();
            txt物品维修价格.Text = 物品.修理价格.ToString();
            txt物品数量.Text = 物品.数量.ToString();
            txt物品附加属性.Text = 物品.附加属性;
            txt物品中文名称.Text = 物品.中文名称;
            txt物品耐久.Text = 物品.当前耐久.ToString();
            txt物品总耐久.Text =物品.总耐久.ToString();
            cmb物品颜色.SelectedIndex = 物品.名称颜色;
        }

        private void btnLogin_Click(object sender, EventArgs e)
        {
            connectStr = "server=" + txt地址.Text + ";port=" + txt端口.Text + ";database=" + txt数据库.Text + ";user=" + txt用户名.Text + ";password=" + txt密码.Text + ";Charset=utf8;";
            MySqlConnection conn = new MySqlConnection(connectStr);
            try
            {
                conn.Open();
                Interaction.SaveSetting("AppName", "Main", "txt地址", txt地址.Text);
                Interaction.SaveSetting("AppName", "Main", "txt密码", txt密码.Text);
                Interaction.SaveSetting("AppName", "Main", "txt数据库", txt数据库.Text);
                Interaction.SaveSetting("AppName", "Main", "txt用户名", txt用户名.Text);
                Interaction.SaveSetting("AppName", "Main", "txt端口", txt端口.Text);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
                return;
            }
            finally
            {
                conn.Close();
            }
            
        }

        private void Main_Load(object sender, EventArgs e)
        {
            txt地址.Text=Interaction.GetSetting("AppName", "Main", "txt地址", "127.0.0.1");
            txt密码.Text=Interaction.GetSetting("AppName", "Main", "txt密码", "");
            txt数据库.Text=Interaction.GetSetting("AppName", "Main", "txt数据库", "sephiroth");
            txt用户名.Text=Interaction.GetSetting("AppName", "Main", "txt用户名","root");
            txt端口.Text=Interaction.GetSetting("AppName", "Main", "txt端口", "6606");
            connectStr = "server=" + txt地址.Text + ";port=" + txt端口.Text + ";database=" + txt数据库.Text + ";user=" + txt用户名.Text + ";password=" + txt密码.Text + ";Charset=utf8;";

            for(int i = 1; i <= 100; i++)
            {
                cmb技能信息等级上限.Items.Add(i.ToString());
                cmb技能信息等级下限.Items.Add(i.ToString());
            }
            cmb技能信息等级下限.SelectedIndex = 0;
            cmb技能信息等级上限.SelectedIndex = 99;
        }

        private void btn刷新物品列表_Click(object sender, EventArgs e)
        {
            MySqlConnection conn = new MySqlConnection(connectStr);
            try
            {
                conn.Open();
                string sql = "SELECT * FROM `物品列表` WHERE id<0";
                MySqlDataAdapter da=new MySqlDataAdapter(sql,conn);
                DataTable dt= new DataTable();
                da.Fill(dt);
                lb物品列表.Items.Clear();
                m_物品列表 = models.物品列表.数据表转数组(dt);

                cmb参考物品列表.Items.Clear();
                sql = "SELECT  * FROM 物品信息";
                da = new MySqlDataAdapter(sql, conn);
                dt= new DataTable();
                da.Fill(dt);
                cmb参考物品列表.Items.Clear();
                m_物品信息 = models.物品信息.数据表转数组(dt);

                for (int i = 0; i < m_物品信息.Length; i++)
                {
                    cmb参考物品列表.Items.Add(m_物品信息[i].英文名称.ToString() + "\t" + m_物品信息[i].Id.ToString());
                }
                txt筛选_TextChanged(null, null);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
                return;
            }
            finally
            {
                conn.Close();
            }
        }

        private void cmb参考物品列表_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cmb参考物品列表.SelectedIndex == -1) return;
            string 物品信息名称 = cmb参考物品列表.SelectedItem.ToString().Split('\t')[0];
            string pic2d = System.IO.Directory.GetCurrentDirectory() + "/物品信息/" + 物品信息名称 + "_2d.gif";
            string pic3d = System.IO.Directory.GetCurrentDirectory() + "/物品信息/" + 物品信息名称 + "_3d.gif";
            if (System.IO.File.Exists(pic2d) == true)
            {
                pic2D.Image = Image.FromFile(pic2d);
            }
            else
            {
                pic2D.Image = null;
            }
            if (System.IO.File.Exists(pic3d) == true)
            {
                pic3D.Image = Image.FromFile(pic3d);
            }
            else
            {
                pic3D.Image = null;
            }
            int 物品信息ID;
            int.TryParse(cmb参考物品列表.SelectedItem.ToString().Split('\t')[1], out 物品信息ID);
            models.物品信息 物品信息=null;
            for(int i = 0; i < m_物品信息.Length; i++)
            {
                物品信息 = m_物品信息[i];
                if (物品信息.Id == 物品信息ID)
                {
                    break;
                }
            }
            cmb穿戴位置.SelectedIndex = 设置ComboIndex(cmb穿戴位置, 物品信息.穿戴位置.ToString());
            cmb物品等级.SelectedIndex = 设置ComboIndex(cmb物品等级, 物品信息.等级.ToString());
            txt物品英文名称.Text = 物品信息.英文名称.ToString();
            string 数量 = 物品信息.数量.ToString();
            if (数量!="" &&数量!="0")
            {
                chb数量.Checked = true;
            }
            else
            {
                chb数量.Checked = false;
            }

            cmb物品宽度.SelectedIndex = 设置ComboIndex(cmb物品宽度, 物品信息.宽度.ToString());
            cmb物品高度.SelectedIndex = 设置ComboIndex(cmb物品高度, 物品信息.高度.ToString());
            cmb持久开关1.SelectedIndex = 设置ComboIndex(cmb持久开关1, 物品信息.持久开关1.ToString());
            cmb持久开关2.SelectedIndex = 设置ComboIndex(cmb持久开关2, 物品信息.持久开关2.ToString());
            txt物品2D名称.Text = 物品信息.外观2D;
            txt物品3D名称.Text = 物品信息.外观3D;
            txt物品集中力.Text = 物品信息.集中力.ToString();
            txt物品集中力.Text = 物品信息.分散力.ToString();
            txt物品脚本.Text = 物品信息.脚本;
            if ((物品信息.种族 & 0x01) != 0)
            {
                chb人类.Checked = true;
            }
            else { 
                chb人类.Checked = false;
            }
            if ((物品信息.种族 & 0x02) != 0)
            {
                chb精灵.Checked = true;
            }
            else
            {
                chb精灵.Checked = false;
            }
            if ((物品信息.职业 & 0x02) != 0)
            {
                chb红法.Checked = true;
            }
            else
            {
                chb红法.Checked = false;
            }
            if ((物品信息.职业 & 0x04) != 0)
            {
                chb蓝法.Checked = true;
            }
            else
            {
                chb蓝法.Checked = false;
            }
            if ((物品信息.职业 & 0x20) != 0)
            {
                chb斗士.Checked = true;
            }
            else
            {
                chb斗士.Checked = false;
            }
            if ((物品信息.职业 & 0x40) != 0)
            {
                chb剑士.Checked = true;
            }
            else
            {
                chb剑士.Checked = false;
            }
            if ((物品信息.职业 & 0x0200) != 0)
            {
                chb弓手.Checked = true;
            }
            else
            {
                chb弓手.Checked = false;
            }

        }

        private void txt筛选_TextChanged(object sender, EventArgs e)
        {
            btn物品筛选_Click(null, null);
        }

        private void btn复制英文名_Click(object sender, EventArgs e)
        {
            Clipboard.SetDataObject(cmb参考物品列表.Text.Split('\t')[0] + "_2d");
        }

        private void btn刷新NPC列表_Click(object sender, EventArgs e)
        {
            MySqlConnection conn = new MySqlConnection(connectStr);
            try
            {
                conn.Open();
                string sql = "SELECT * FROM npc列表";
                MySqlDataAdapter da = new MySqlDataAdapter(sql, conn);
                DataTable dt= new DataTable();
                da.Fill(dt);
                m_NPC列表 = models.NPC列表.数据表转数组(dt);
                lbNPC列表.Items.Clear();
                txt筛选NPC_TextChanged(null, null);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
                return;
            }
            finally
            {
                conn.Close();
            }
        }

        private void txt筛选NPC_TextChanged(object sender, EventArgs e)
        {
            string 搜索字符 = txt筛选NPC.Text;
            lbNPC列表.Items.Clear();
            if (m_NPC列表 == null)
            {
                btn刷新NPC列表_Click(null, null);
            }
            foreach(models.NPC列表 npc in m_NPC列表)
            {
                string 中文名称 = npc.中文名称;
                if ((搜索字符.Length == 0) || 中文名称.IndexOf(搜索字符) != -1)
                {
                    lbNPC列表.Items.Add(中文名称.ToString() + "\t" + npc.Id.ToString());
                }
            }
        }

        private void lbNPC列表_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lbNPC列表.SelectedIndex == -1) return;
            string NPC名称 = lbNPC列表.Text.Split('\t')[0];
            models.NPC列表 NPC = null;
            for (int i = 0; i < m_NPC列表.Length; i++)
            {
                NPC = m_NPC列表[i];
                if (NPC.中文名称 == NPC名称)
                {
                    break;
                }
            }
            for (int i = 0; i < cmbNpc参考.Items.Count; i++)
            {
                if (NPC.英文名称 == cmbNpc参考.Items[i].ToString())
                {
                    cmbNpc参考.SelectedIndex = i;
                    break;
                }
            }
            txtNPCX.Text = NPC.X.ToString();
            txtNPCY.Text = NPC.Y.ToString();
            txtNPCZ.Text = NPC.Z.ToString();
            txtNPC欢迎语.Text = NPC.欢迎语;
            txtNPC大小.Text = NPC.大小.ToString();
        }

        private void button7_Click(object sender, EventArgs e)
        {

        }

        private void btn复制NPC名称_Click(object sender, EventArgs e)
        {
            Clipboard.SetDataObject(cmb参考物品列表.Text.Split('\t')[0] );
        }

        private void cmbNpc参考_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cmbNpc参考.SelectedIndex == -1) return;
            string pic = System.IO.Directory.GetCurrentDirectory() + "/NPC信息/" + cmbNpc参考.Text+ ".jpg";
            if (System.IO.File.Exists(pic) == true)
            {
                picNpc.Image = Image.FromFile(pic);
            }
            else
            {
                picNpc.Image = null;
            }
        }
        public int 设置ComboIndex(ComboBox 列表,string id)
        {
            for(int i = 0; i < 列表.Items.Count; i++)
            {
                string[] sp = 列表.Items[i].ToString().Split(' ');
                if (sp[0] == id)
                {
                    return i;
                }
            }
            return -1;
        }
        public int 获取ComboIndex(ComboBox 列表)
        {
            if (列表.Text.Length == 0)
            {
                return 0;
            }
             return int.Parse(列表.Text.Split(' ')[0]);
        }
        private void btn物品筛选_Click(object sender, EventArgs e)
        {
            string 搜索字符 = txt筛选.Text;
            if (m_物品列表 == null)
            {
                btn刷新物品列表_Click(null, null);
            }
            if (m_物品列表 == null)
            {
                return;
            }
                int 掩码 = 0;
            if (chb筛选红法.Checked == true)
            {
                掩码 |= 0x02;
            }
            if (chb筛选蓝法.Checked == true)
            {
                掩码 |= 0x04;
            }
            if (chb筛选斗士.Checked == true)
            {
                掩码 |= 0x20;
            }
            if (chb筛选剑士.Checked == true)
            {
                掩码 |= 0x40;
            }
            if (chb筛选弓手.Checked == true)
            {
                掩码 |= 0x0200;
            }
            lb物品列表.Items.Clear();
            int[] arr = new int[m_物品列表.Length];
            for(int i = 0; i < arr.Length; i++)
            {
                arr[i] = 0;
            }
            for(int i=0;i< m_物品列表.Length;i++)
            {
                models.物品列表 物品 = m_物品列表[i];
                string 中文名称 = 物品.中文名称;
                if ((搜索字符.Length == 0) || 中文名称.IndexOf(搜索字符) != -1)
                {
                    arr[i] = 物品.信息ID;
                    //lb物品列表.Items.Add(中文名称.ToString() + "\t" + 物品["id"].ToString());
                }
            }
            if (掩码 != 0)
            {
                for (int i = 0; i < arr.Length; i++)
                {
                    if (arr[i] == 0) continue;
                    for(int ii=0;ii< m_物品信息.Length; ii++)
                    {
                        if (m_物品信息[ii].Id != arr[i]) continue;
                        if ((掩码 & m_物品信息[ii].职业) != 掩码)
                        {
                            arr[i] = 0; //清除不符合的数据
                        }
                        break;
                    }
                    
                }
            }
            if (cmb筛选等级.SelectedIndex > 0)
            {
                for (int i = 0; i < arr.Length; i++)
                {
                    if (arr[i] == 0) continue;
                    for (int ii = 0; ii < m_物品信息.Length; ii++)
                    {
                        if (m_物品信息[ii].Id != arr[i]) continue;
                        if (m_物品信息[ii].等级 != cmb筛选等级.SelectedIndex)
                        {
                            arr[i] = 0; //清除不符合的数据
                        }
                        break;
                    }

                }

            }
            //开始输出筛选后的数据
            for(int i=0;i<arr.Length;i++)
            {
                if (arr[i] == 0) continue;
                lb物品列表.Items.Add(m_物品列表[i].中文名称 + "\t" + m_物品列表[i].Id);
            }
        }

        private void checkBox5_CheckedChanged(object sender, EventArgs e)
        {
            btn物品筛选_Click(null, null);
        }

        private void checkBox3_CheckedChanged(object sender, EventArgs e)
        {
            btn物品筛选_Click(null, null);
        }

        private void checkBox4_CheckedChanged(object sender, EventArgs e)
        {
            btn物品筛选_Click(null, null);
        }

        private void checkBox2_CheckedChanged(object sender, EventArgs e)
        {
            btn物品筛选_Click(null, null);
        }

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            btn物品筛选_Click(null, null);
        }

        private void cmb筛选等级_SelectedIndexChanged(object sender, EventArgs e)
        {
            btn物品筛选_Click(null, null);
        }

        private void btn保存物品列表_Click(object sender, EventArgs e)
        {
            if (lb物品列表.SelectedIndex == -1) return;
            string 物品名称 = lb物品列表.Text.Split('\t')[0];
            models.物品列表 原物品 = null;
            for (int i = 0; i < m_物品列表.Length; i++)
            {
                原物品 = m_物品列表[i];
                if (原物品.中文名称 == 物品名称)
                {
                    break;
                }
            }
            models.物品列表 物品 = 同步到物品列表();
            if (物品 == null) return;
            物品.Id = 原物品.Id;
            string msg=物品.保存已有物品(connectStr);
            if (msg.Length != 0)
            {
                MessageBox.Show(msg);
                return;
            }
            else
            {
                btn刷新物品列表_Click(null, null);
            }
        }
        private void btn新建物品_Click(object sender, EventArgs e)
        {
            models.物品列表 物品 = 同步到物品列表();
            if (物品 == null) return;
            int 最小值 = 0;
            for (int i = 0; i < m_物品列表.Length; i++)
            {
                if (m_物品列表[i].Id < 最小值)
                {
                    最小值 = m_物品列表[i].Id;
                }
            }
            最小值 -= 1;
            string msg = 物品.新建物品(connectStr, 最小值);
            if (msg.Length != 0)
            {
                MessageBox.Show(msg);
                return;
            }
            else
            {
                btn刷新物品列表_Click(null, null);
            }
        }
        public models.物品列表 同步到物品列表()
        {
            models.物品列表 物品 = new models.物品列表();
            //开始输出物品信息
            物品.中文名称 = txt物品中文名称.Text;
            if (float.TryParse(txt物品倍率.Text, out 物品.物品倍率) == false)
            {
                MessageBox.Show("物品倍率不正确");
                return null;
            }
            if (Int64.TryParse(txt物品售价.Text, out 物品.售价) == false)
            {
                MessageBox.Show("售价不正确");
                return null; ;
            }
            if (Int64.TryParse(txt物品维修价格.Text, out 物品.修理价格) == false)
            {
                MessageBox.Show("维修价格不正确");
                return null; ;
            }
            if (chb数量.Checked == true)
            {
                if (int.TryParse(txt物品数量.Text, out 物品.数量) == false)
                {
                    MessageBox.Show("数量不正确");
                    return null; ;
                }
            }
            else
            {
                物品.数量 = 0;
            }
            物品.附加属性 = txt物品附加属性.Text;
            物品.中文名称 = txt物品中文名称.Text;
            if (float.TryParse(txt物品耐久.Text, out 物品.当前耐久) == false)
            {
                MessageBox.Show("当前耐久不正确");
                return null; ;
            }
            if (float.TryParse(txt物品总耐久.Text, out 物品.总耐久) == false)
            {
                MessageBox.Show("总耐久不正确");
                return null; ;
            }
            //如果已经有属性，但颜色为0就会出现不显示的情况，所以要在这里设置上
            if ((txt物品附加属性.Text.Length != 0) && (cmb物品颜色.SelectedIndex == 0))
            {
                cmb物品颜色.SelectedIndex = 1;
            }
            物品.名称颜色 = (byte)cmb物品颜色.SelectedIndex;
            if (cmb参考物品列表.SelectedIndex == -1)
            {
                MessageBox.Show("物品参考信息必须选择!");
                return null;
            }
            int.TryParse(cmb参考物品列表.Text.Split('\t')[1], out 物品.信息ID);
            return 物品;
        }
        public models.物品信息 同步到物品信息()
        {
            models.物品信息 物品信息 = new models.物品信息();
            //开始输出物品信息
            物品信息.英文名称= txt物品英文名称.Text;
            物品信息.穿戴位置 = 获取ComboIndex(cmb穿戴位置);
            物品信息.等级 = 获取ComboIndex(cmb物品等级);
            if (chb数量.Checked == true)
            {
                物品信息.数量 = true;
            }
            物品信息.宽度 = 获取ComboIndex(cmb物品宽度);
            物品信息.高度 = 获取ComboIndex(cmb物品高度);
            物品信息.持久开关1 = 获取ComboIndex(cmb持久开关1);
            物品信息.持久开关2 = 获取ComboIndex(cmb持久开关2);
            物品信息.脚本 = txt物品脚本.Text;
            物品信息.外观2D=txt物品2D名称.Text ;
            物品信息.外观3D=txt物品3D名称.Text;
            if (int.TryParse(txt物品集中力.Text,out 物品信息.集中力) == false)
            {
                MessageBox.Show("集中力不正确");
                return null;

            }
            if (int.TryParse(txt物品分散力.Text, out 物品信息.分散力) == false)
            {
                MessageBox.Show("分散力不正确");
                return null;

            }
            if (chb人类.Checked == true)
            {
                物品信息.种族 |= 0x01;
            }
            if (chb精灵.Checked == true)
            {
                物品信息.种族 |= 0x02;
            }

            if (chb红法.Checked == true)
            {
                物品信息.职业 |= 0x02;
            }
            if(chb蓝法.Checked == true)
            {
                物品信息.职业 |= 0x04;
            }
            if(chb斗士.Checked == true)
            {
                物品信息.职业 |= 0x20;
            }
            if(chb剑士.Checked == true)
            {
                物品信息.职业 |= 0x40;
            }
            if(chb弓手.Checked == true)
            {
                物品信息.职业 |= 0x0200;
            }
            return 物品信息;
        }
        private void 保存物品信息_Click(object sender, EventArgs e)
        {
            models.物品信息 物品信息 = 同步到物品信息();
            if (物品信息 == null) return;
            int id = int.Parse(cmb参考物品列表.Text.Split('\t')[1]);
            物品信息.Id = id;
            string msg=物品信息.保存已有物品(connectStr);
            if (msg.Length != 0)
            {
                MessageBox.Show(msg);
                return;
            }
            else
            {
                btn刷新物品列表_Click(null, null);
            }

        }

        private void btn刷新附加属性_Click(object sender, EventArgs e)
        {
            MySqlConnection conn = new MySqlConnection(connectStr);
            try
            {
                conn.Open();
                string sql = "SELECT * FROM 附加属性信息";
                MySqlDataAdapter da = new MySqlDataAdapter(sql, conn);
                DataTable dt = new DataTable();
                da.Fill(dt);
                lb附加属性列表.Items.Clear();
                m_附加属性信息 = models.附加属性信息.数据表转数组(dt);

                cmb参考物品列表.Items.Clear();

                for (int i = 0; i < m_附加属性信息.Length; i++)
                {
                    lb附加属性列表.Items.Add(m_附加属性信息[i].中文名.ToString() + "\t" + m_附加属性信息[i].Id.ToString());
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
                return;
            }
            finally
            {
                conn.Close();
            }
        }

        private void lb附加属性列表_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lb附加属性列表.SelectedIndex == -1) return;
            models.附加属性信息 附加属性信息=null;
            int 附加属性id =int.Parse(lb附加属性列表.Text.Split('\t')[1]);
            for(int i=0;i< m_附加属性信息.Length; i++)
            {
                附加属性信息 = m_附加属性信息[i];
                if(附加属性id == 附加属性信息.Id)
                {
                    break;
                }
            }
            txt附加中文名称.Text = 附加属性信息.中文名;
            txt附加升级幂.Text = 附加属性信息.升级幂.ToString();
            txt附加属性等级比重.Text = 附加属性信息.属性等级比重.ToString();
            txt附加幸运比重.Text = 附加属性信息.幸运比重.ToString();
            txt附加物品等级比重.Text = 附加属性信息.物品等级比重.ToString();
            txt附加耐久比重.Text = 附加属性信息.耐久比重.ToString();
            txt附加英文名.Text = 附加属性信息.英文名;
            txt附加附魔概率.Text = 附加属性信息.附魔概率.ToString();
            string s = 附加属性信息.添加到属性;
            if (s.Length > 2)
            {
                s = s.Substring(1, s.Length - 2);
                string[] sp = s.Split(',');
                s = "";
                for(int i = 0; i < sp.Length; i++)
                {

                    string[] sp1 = sp[i].Split(':');
                    s += sp1[0].Substring(1, sp1[0].Length - 2);
                    s += " ";
                    s += sp1[1];
                    s += "\r\n";
                }
            }
            else
            {
                s = "";
            }
            txt附加添加到属性.Text = s;
            for(int i=0;i< cbl附加位置.Items.Count; i++)
            {
                int 码;
                码=int.Parse(cbl附加位置.Items[i].ToString().Split(' ')[0]);
                if ((附加属性信息.穿戴位置掩码 & 码) != 0)
                {
                    cbl附加位置.SetItemChecked(i, true);
                }
                else
                {
                    cbl附加位置.SetItemChecked(i, false);
                }
            }
            for (int i = 0; i < cbl附加职业.Items.Count; i++)
            {
                int 码;
                码 = int.Parse(cbl附加职业.Items[i].ToString().Split(' ')[0]);
                if ((附加属性信息.职业掩码 & 码) != 0)
                {
                    cbl附加职业.SetItemChecked(i, true);
                }
                else
                {
                    cbl附加职业.SetItemChecked(i, false);
                }
            }
        }
        private void btn保存现有附加属性_Click(object sender, EventArgs e)
        {
            if (lb附加属性列表.SelectedIndex == -1) return;
            string 属性名称 = lb附加属性列表.Text.Split('\t')[0];
            models.附加属性信息 原属性 = null;
            for (int i = 0; i < m_附加属性信息.Length; i++)
            {
                原属性 = m_附加属性信息[i];
                if (原属性.中文名 == 属性名称)
                {
                    break;
                }
            }
            models.附加属性信息 附加属性信息 = 同步到附加信息列表();
            if (附加属性信息 == null) return;
            附加属性信息.Id = 原属性.Id;
            string msg = 附加属性信息.保存已有物品(connectStr);
            if (msg.Length != 0)
            {
                MessageBox.Show(msg);
                return;
            }
            else
            {
                btn刷新附加属性_Click(null, null);
            }
        }
        public models.附加属性信息 同步到附加信息列表()
        {
            models.附加属性信息 属性 = new models.附加属性信息();

            属性.中文名 = txt附加中文名称.Text;
            if(float.TryParse(txt附加升级幂.Text,out 属性.升级幂) == false)
            {
                MessageBox.Show("升级幂错误");
                return null;
            }
            if(float.TryParse(txt附加属性等级比重.Text ,out 属性.属性等级比重) == false)
            {
                MessageBox.Show("升级幂错误");
                return null;
            }
            if (float.TryParse(txt附加幸运比重.Text,out 属性.幸运比重) == false)
            {
                MessageBox.Show("幸运比重错误");
                return null;
            }
            if (float.TryParse(txt附加物品等级比重.Text ,out 属性.物品等级比重) == false)
            {
                MessageBox.Show("物品等级比重错误");
                return null;
            }
            if (float.TryParse(txt附加耐久比重.Text ,out 属性.耐久比重) == false)
            {
                MessageBox.Show("耐久比重错误");
                return null;
            }
            属性.英文名=txt附加英文名.Text ;
            if (int.TryParse(txt附加附魔概率.Text, out 属性.附魔概率) == false)
            {
                MessageBox.Show("附魔概率错误");
                return null;
            }
            string[] sp = txt附加添加到属性.Text.Split('\n');
            属性.添加到属性 = "{";
            for(int i = 0; i < sp.Length; i++)
            {
                sp[i] = sp[i].Replace("\r", "");
                if (sp[i].Length == 0) continue;
                string[] sp1 = sp[i].Split(' ');
                if(i!=0) 属性.添加到属性 += ",";
                属性.添加到属性 += "\"" + sp1[0] + "\":" + sp1[1];
            }
            属性.添加到属性 += "}";
            for (int i = 0; i < cbl附加位置.Items.Count; i++)
            {
                if (cbl附加位置.GetItemChecked(i) == true)
                {
                    int 码 = int.Parse(cbl附加位置.Items[i].ToString().Split(' ')[0]);
                    属性.穿戴位置掩码 |= 码;
                }
            }
            for (int i = 0; i < cbl附加职业.Items.Count; i++)
            {
                if (cbl附加职业.GetItemChecked(i) == true)
                {
                    int 码 = int.Parse(cbl附加职业.Items[i].ToString().Split(' ')[0]);
                    属性.职业掩码 |= 码;
                }
            }
            return 属性;
        }

        private void btn保存NPC属性_Click(object sender, EventArgs e)
        {
            if (lbNPC列表.SelectedIndex == -1) return;
            string NPC名称  = lbNPC列表.Text.Split('\t')[0];
            models.NPC列表 原NPC = null;
            for (int i = 0; i < m_物品列表.Length; i++)
            {
                原NPC = m_NPC列表[i];
                if (原NPC.中文名称 == NPC名称)
                {
                    break;
                }
            }
            models.NPC列表 NPC = 同步到NPC列表();
            if (NPC == null) return;
            NPC.Id = 原NPC.Id;
            string msg = NPC.保存已有NPC(connectStr);
            if (msg.Length != 0)
            {
                MessageBox.Show(msg);
                return;
            }
            else
            {
                btn刷新NPC列表_Click(null, null);
            }
        }
        public models.NPC列表 同步到NPC列表()
        {
            if (lbNPC列表.SelectedIndex == -1) return null;
            string NPC名称 = lbNPC列表.Text.Split('\t')[0];
            models.NPC列表 NPC = null;
            for(int i = 0; i < m_NPC列表.Length; i++) {
                NPC = m_NPC列表[i];
                if (NPC.中文名称== NPC名称)
                {
                    break;
                }
            }
            if (int.TryParse(txtNPCX.Text ,out NPC.X) == false){
                MessageBox.Show("NPC X位置错!");
                return null;
            }
            if (int.TryParse(txtNPCY.Text, out NPC.Y) == false)
            {
                MessageBox.Show("NPC Y位置错!");
                return null;
            }
            if (int.TryParse(txtNPCZ.Text, out NPC.Z) == false)
            {
                MessageBox.Show("NPC Z位置错!");
                return null;
            }
            NPC.欢迎语=txtNPC欢迎语.Text ;
            txtNPC大小.Text = NPC.大小.ToString();
            return NPC;
        }

        private void btn刷新_Click(object sender, EventArgs e)
        {
            MySqlConnection conn = new MySqlConnection(connectStr);
            try
            {
                conn.Open();
                string sql = "SELECT * FROM 怪物掉宝 ORDER BY id asc";
                MySqlDataAdapter da = new MySqlDataAdapter(sql, conn);
                DataTable dt = new DataTable();
                da.Fill(dt);
                m_怪物掉宝 = models.怪物掉宝.数据表转数组(dt);
                lb怪物掉宝.Items.Clear();
                txt掉宝筛选_TextChanged(null, null);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
                return;
            }
            finally
            {
                conn.Close();
            }
        }

        private void lb怪物掉宝_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lb怪物掉宝.SelectedIndex == -1) return;
            models.怪物掉宝 怪物掉宝= null;
            int 怪物掉宝id = int.Parse(lb怪物掉宝.Text.Split(' ')[0]);
            for (int i = 0; i < m_怪物掉宝.Length; i++)
            {
                怪物掉宝 = m_怪物掉宝[i];
                if (怪物掉宝id == 怪物掉宝.Id)
                {
                    break;
                }
            }
            string s = 怪物掉宝.掉落物品;
            if (s.Length > 2)
            {
                s = s.Substring(1, s.Length - 2);
                string[] sp = s.Split(',');
                s = "";
                for (int i = 0; i < sp.Length; i++)
                {
                    string[] sp1 = sp[i].Split(':');
                    s += sp1[1];
                    s += " ";
                    s += sp1[0].Substring(1, sp1[0].Length - 2);                    
                    s += "\r\n";
                }
            }
            else
            {
                s = "";
            }
            txt怪物掉宝.Text = s;
            txt怪物掉宝区域名称.Text = 怪物掉宝.区域名称;
        }

        private void txt掉宝筛选_TextChanged(object sender, EventArgs e)
        {
            string 搜索字符 = txt掉宝筛选.Text;
            lb怪物掉宝.Items.Clear();
            foreach (models.怪物掉宝 item in m_怪物掉宝)
            {
                string 区域名称 = item.区域名称;
                if ((搜索字符.Length == 0) || 区域名称.IndexOf(搜索字符) != -1)
                {
                    lb怪物掉宝.Items.Add(item.Id.ToString() + " " + 区域名称.ToString());
                }
                else if (item.掉落物品.IndexOf(搜索字符) != -1)
                {
                    lb怪物掉宝.Items.Add(item.Id.ToString() + " " +区域名称.ToString() );
                }
            }
        }

        private void btn保存已经掉宝_Click(object sender, EventArgs e)
        {
            if (lb怪物掉宝.SelectedIndex == -1) return;
            string 原名称 = lb怪物掉宝.Text.Split(' ')[1];
            models.怪物掉宝 怪物掉宝 = 同步到怪物掉宝();
            if (怪物掉宝 == null) return;
            string msg = 怪物掉宝.保存已有行(connectStr, 原名称);
            if (msg.Length != 0)
            {
                MessageBox.Show(msg);
                return;
            }
            else
            {
                btn刷新_Click(null, null);
            }
        }

        private void btn新建掉宝_Click(object sender, EventArgs e)
        {
            if (lb怪物掉宝.SelectedIndex == -1) return;
            models.怪物掉宝 怪物掉宝 = 同步到怪物掉宝();
            if (怪物掉宝 == null) return;
            string msg = 怪物掉宝.新建区域(connectStr);
            if (msg.Length != 0)
            {
                MessageBox.Show(msg);
                return;
            }
            else
            {
                btn刷新_Click(null, null);
            }
        }
        public models.怪物掉宝 同步到怪物掉宝()
        {
            if (lb怪物掉宝.SelectedIndex == -1) return null;
            models.怪物掉宝 怪物掉宝 = null;
            int 怪物掉宝id = int.Parse(lb怪物掉宝.Text.Split(' ')[0]);
            for (int i = 0; i < m_怪物掉宝.Length; i++)
            {
                怪物掉宝 = m_怪物掉宝[i];
                if (怪物掉宝id == 怪物掉宝.Id)
                {
                    break;
                }
            }
            string[] sp = txt怪物掉宝.Text.Split('\n');
            string[] 名称 = new string[sp.Length];
            int[] 掉率 = new int[sp.Length];
            for (int i = 0; i < sp.Length; i++)
            {
                sp[i] = sp[i].Replace("\r", "");
                if (sp[i].Length == 0) continue;
                string[] sp1 = sp[i].Split(' ');
                //if (i != 0) 怪物掉宝.掉落物品 += ",";
                if (sp1.Length == 1)
                {
                    MessageBox.Show("行格式错");
                    return null;
                }
                名称[i] = sp1[1];
                int.TryParse(sp1[0], out 掉率[i]);
            }
            怪物掉宝.掉落物品 = "";
            while (true)
            {
                int min = 999999999;
                int 找到的行 = -1;
                for (int i = 0; i < sp.Length; i++)
                {
                    if ((min > 掉率[i]) && (名称[i] != null))
                    {
                        找到的行 = i;
                        min = 掉率[i];
                    }
                }
                if (找到的行 == -1)
                {
                    break;
                }
                if (怪物掉宝.掉落物品.Length != 0)
                {
                    怪物掉宝.掉落物品 += ",";
                }
                怪物掉宝.掉落物品 += "\"" + 名称[找到的行] + "\":" + 掉率[找到的行].ToString();
                名称[找到的行] = "";
                掉率[找到的行] = 999999999;
            }
            怪物掉宝.掉落物品 = "{" + 怪物掉宝.掉落物品;
            怪物掉宝.掉落物品 += "}";
            怪物掉宝.区域名称 = txt怪物掉宝区域名称.Text;
            return 怪物掉宝;
        }

        private void btn复制物品名称_Click(object sender, EventArgs e)
        {
            StringBuilder s = new StringBuilder();
            for(int i = 0; i < lb物品列表.Items.Count; i++)
            {
                s.Append(lb物品列表.Items[i].ToString().Split('\t')[0] + "\r\n");
            }
            Clipboard.SetDataObject(s.ToString());
        }

        private void btn刷新技能_Click(object sender, EventArgs e)
        {
            MySqlConnection conn = new MySqlConnection(connectStr);
            try
            {
                conn.Open();
                string sql = "SELECT * FROM 技能信息";
                MySqlDataAdapter da = new MySqlDataAdapter(sql, conn);
                DataTable dt = new DataTable();
                da.Fill(dt);
                lb技能信息表.Items.Clear();
                m_技能信息 = models.技能信息.数据表转数组(dt);
                btn筛选技能_Click(null, null);
                if (m_基础属性 == null)
                {
                    cl基本属性列表.Items.Clear();
                    sql = "SELECT * FROM 基础属性 ORDER BY ID ASC";
                    da = new MySqlDataAdapter(sql, conn);
                    dt = new DataTable();
                    da.Fill(dt);
                    m_基础属性 = new Dictionary<string, int>();
                    for (int i = 0; i < dt.Rows.Count; i++) {
                        DataRow dr = dt.Rows[i];
                        string 名称 = dr["名称"].ToString();
                        cl基本属性列表.Items.Add( 名称);
                        m_基础属性[名称] = i;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
                return;
            }
            finally
            {
                conn.Close();
            }
        }

        private void label38_Click(object sender, EventArgs e)
        {

        }

        private void btn新建物品信息_Click(object sender, EventArgs e)
        {
            models.物品信息 物品信息 = 同步到物品信息();
            if (物品信息 == null) return;
            int minid = 65535;
            for(int i = 0; i < m_物品信息.Length; i++)
            {
                if (m_物品信息[i].Id < minid)
                {
                    minid = m_物品信息[i].Id;
                }
            }
            minid--;
            string msg = 物品信息.新建(connectStr,minid);
            if (msg.Length != 0)
            {
                MessageBox.Show(msg);
                return;
            }
            else
            {
                btn刷新物品列表_Click(null, null);
            }
        }

        private void btn分析并导入物品_Click(object sender, EventArgs e)
        {
            try
            {
                using (System.Net.Sockets.TcpClient tcp = new System.Net.Sockets.TcpClient(txt操作IP.Text, 2285))
                {
                    System.Net.Sockets.NetworkStream ns = tcp.GetStream();
                    string s;
                    s = "ADDITEM\n" + txt操作密钥.Text + "\n" + txt物品数据包.Text;
                    byte[] bys = System.Text.Encoding.Default.GetBytes(s);
                    ns.Write(bys, 0, bys.Length);
                    byte[] buff = new byte[1024];
                    int len = ns.Read(buff, 0, buff.Length);
                    string rev = System.Text.Encoding.Default.GetString(buff, 0, len);
                    txt添加物品返回信息.Text = rev;
                }
            }catch(Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
        private void btn向角色发送数据_Click(object sender, EventArgs e)
        {
            using (System.Net.Sockets.TcpClient tcp = new System.Net.Sockets.TcpClient(txt操作IP.Text, 2285))
            {
                System.Net.Sockets.NetworkStream ns = tcp.GetStream();
                string s;
                s = "SUPERCMD\n" + txt操作密钥.Text + "\n" + txt角色名称.Text + "\n" + txtCMD.Text;
                byte[] bys = System.Text.Encoding.Default.GetBytes(s);
                ns.Write(bys, 0, bys.Length);
                byte[] buff = new byte[1024];
                int len = ns.Read(buff, 0, buff.Length);
                string rev = System.Text.Encoding.Default.GetString(buff, 0, len);
                txtRev.Text = rev;
            }
        }

        private void btn筛选技能_Click(object sender, EventArgs e)
        {
            string 搜索字符 = txt筛选技能.Text;
            if (m_技能信息 == null)
            {
                btn刷新技能_Click(null, null);
            }
            if (m_技能信息 == null)
            {
                return;
            }
            lb技能信息表.Items.Clear();
            int[] arr = new int[m_技能信息.Length];
            for (int i = 0; i < arr.Length; i++)
            {
                arr[i] = 0;
            }
            for (int i = 1; i < m_技能信息.Length; i++)
            {
                models.技能信息 技能信息 = m_技能信息[i];
                string 中文名称 = 技能信息.技能中文名;
                if ((搜索字符.Length == 0) || (中文名称.IndexOf(搜索字符) != -1))
                {
                    arr[i] = 技能信息.Id;
                }
            }
            //开始输出筛选后的数据
            for (int i = 0; i < arr.Length; i++)
            {
                if (arr[i] == 0) continue;
                lb技能信息表.Items.Add(m_技能信息[i].技能中文名+ "\t" + m_技能信息[i].Id);
            }
        }

        private void txt筛选技能_TextChanged(object sender, EventArgs e)
        {
            btn筛选技能_Click(null, null);
        }

        private void lb技能信息表_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lb技能信息表.SelectedIndex == -1) return;
            int 技能ID;
            if (int.TryParse(lb技能信息表.Text.Split('\t')[1],out 技能ID) == false)
            {
                return;
            }
            models.技能信息 技能信息 = m_技能信息[技能ID];
            for(int i=0;i< cl基本属性列表.Items.Count; i++)
            {
                cl基本属性列表.SetItemChecked(i, false);
            }
            for (int i = 1; i <= 100; i++)
            {
                foreach(var item in 技能信息.V基础属性[i])
                {
                    int index = m_基础属性[item.Key];
                    cl基本属性列表.SetItemChecked(index,true);
                }
            }
            btn刷新技能曲线_Click(null, null);
        }

        private void btn生成技能攻击力_Click(object sender, EventArgs e)
        {
            if (lb技能信息表.SelectedIndex == -1) return;
            int 技能ID;
            if (int.TryParse(lb技能信息表.Text.Split('\t')[1], out 技能ID) == false)
            {
                return;
            }
            models.技能信息 技能信息 = m_技能信息[技能ID];
            DataTable dt = new DataTable();
            foreach (var item in cl基本属性列表.CheckedItems)
            {
                string 字段 = item.ToString();
                for (int i = (cmb技能信息等级下限.SelectedIndex+1); i <= (cmb技能信息等级上限.SelectedIndex+1); i++)
                {
                    if (radioButton1.Checked == true)
                    {
                        int 基础值;
                        if (int.TryParse(txt技能信息基础值.Text, out 基础值) == false)
                        {
                            MessageBox.Show("基础值错误");
                            return;
                        }
                        float 幂;
                        if (float.TryParse(txt技能信息幂.Text, out 幂) == false)
                        {
                            MessageBox.Show("幂错误");
                            return;
                        }

                        float 终值 = (float)Math.Pow(i, 幂);
                        终值 += 基础值;
                        技能信息.V基础属性[i][字段] = (int)终值;
                    }
                    else if (radioButton2.Checked == true)
                    {
                        int 基础值;
                        if (int.TryParse(txt技能信息步进基础值.Text, out 基础值) == false)
                        {
                            MessageBox.Show("基础值错误");
                            return;
                        }
                        float 步进值;
                        if (float.TryParse(txt技能信息步进步进值.Text, out 步进值) == false)
                        {
                            MessageBox.Show("步进值错误");
                            return;
                        }
                        float 终值 = 基础值 + (i-1) * 步进值;
                        技能信息.V基础属性[i][字段] = (int)终值;
                    }
                }
            }
            btn刷新技能曲线_Click(null, null);
        }

        private void btn保存技能信息_Click(object sender, EventArgs e)
        {
            if (lb技能信息表.SelectedIndex == -1) return;
            int 技能ID;
            if (int.TryParse(lb技能信息表.Text.Split('\t')[1], out 技能ID) == false)
            {
                return;
            }
            models.技能信息 技能信息 = m_技能信息[技能ID];
            string msg = 技能信息.保存(connectStr);
            if (msg.Length != 0)
            {
                MessageBox.Show(msg);
            }
            else
            {
                MessageBox.Show("保存完成");
            }
        }

        private void btn刷新技能曲线_Click(object sender, EventArgs e)
        {
            if (lb技能信息表.SelectedIndex == -1) return;
            int 技能ID;
            if (int.TryParse(lb技能信息表.Text.Split('\t')[1], out 技能ID) == false)
            {
                return;
            }
            models.技能信息 技能信息 = m_技能信息[技能ID];
            chart1.Series.Clear();
            //chart1.chartArea
            
            float 最小值 = 6000;
            float 最大值 = 0;
            foreach (var item in cl基本属性列表.CheckedItems)
            {
                string 字段 = item.ToString();
                System.Windows.Forms.DataVisualization.Charting.Series ser = new System.Windows.Forms.DataVisualization.Charting.Series();
                ser.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
                ser.Name = item.ToString();
           //     ser.IsXValueIndexed = false;
                ser.YAxisType = System.Windows.Forms.DataVisualization.Charting.AxisType.Primary;
                for (int i = (cmb技能信息等级下限.SelectedIndex+1); i <= (cmb技能信息等级上限.SelectedIndex+1); i++)
                {
                    float 值 = 0;
                    if (技能信息.V基础属性[i].ContainsKey(字段) == true)
                    {
                        值 = float.Parse(技能信息.V基础属性[i][字段].ToString());
                    }
                    ser.BorderWidth = 3;
                    ser.Points.AddXY(i, (int)值);
                    if (值 > 最大值) 最大值 = 值;
                    if (值 < 最小值) 最小值 = 值;
                }
                chart1.Series.Add(ser);
            }
            if (最大值 == 最小值) 最大值 = 最小值 + 1;
            chart1.ChartAreas[0].AxisY.Maximum = 最大值;
            chart1.ChartAreas[0].AxisY.Minimum = 最小值;
        }

        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            cmb技能信息等级下限.SelectedIndex = 0;
            cmb技能信息等级上限.SelectedIndex = 99;
        }

        private void btn浮点转BYTE_Click(object sender, EventArgs e)
        {
            float a;
            if (float.TryParse(textBox4.Text, out a) == false)
            {
                MessageBox.Show("数值不对!");
            }
            byte[] bys = BitConverter.GetBytes(a);
            textBox3.Text =models.Basic.Hex2Str(bys, 0, 4, true);
        }

        private void btnBYTE转浮点_Click(object sender, EventArgs e)
        {
            float a;
            string msg;
            byte[] bys;
            if (models.Basic.StrToHex(textBox3.Text, 0, textBox3.Text.Length, out bys, out msg) == false)
            {
                MessageBox.Show(msg);
                return;
            }
            a = BitConverter.ToSingle(bys, 0);
            textBox4.Text = a.ToString();
        }
        private void button2_Click(object sender, EventArgs e)
        {
            string[] sp = txtCommand.Text.Split('\n');
            string msg;
            byte[] bys0;
            byte[] bys1;
            if (models.Basic.StrToHex(sp[0], 0, sp[00].Length, out bys0, out msg) == false)
            {
                MessageBox.Show(msg);
                return;
            }
            if (models.Basic.StrToHex(sp[1], 0, sp[1].Length, out bys1, out msg) == false)
            {
                MessageBox.Show(msg);
                return;
            }
            for (int i = 0; i < bys1.Length; i += 2)
            {
                bys1[i] = bys0[i];
            }
            txtOutCmd.Text = models.Basic.Hex2Str(bys1, 0, bys1.Length, true);
        }

        private void btn字符串转HEX_Click(object sender, EventArgs e)
        {
            byte[] bys = System.Text.Encoding.Default.GetBytes(txtOutCmd.Text);
            txtOutCmd.Text = models.Basic.Hex2Str(bys, 0, bys.Length, true);
            txtAscii.Text = "转换完成";
        }

        private void btnHEX转字符串_Click(object sender, EventArgs e)
        {
            byte[] bys;
            string msg;
            if(models.Basic.StrToHex(txtOutCmd.Text,0, txtOutCmd.Text.Length,out bys,out msg) == false)
            {
                txtAscii.Text = "错误,错误信息:" +msg;
            }
            else
            {
                txtOutCmd.Text = System.Text.Encoding.Default.GetString(bys);
                txtAscii.Text = "转换完成" ;
            }
            
        }

        private void btn自动拆包_Click(object sender, EventArgs e)
        {
            string msg;
            string s = txtOutCmd.Text;
            string[] sp = s.Split('\n');
            string ret = sp[0] + "\r\n";
            for (int i = 1; i < sp.Length; i++)
            {
                string v = sp[i];
                if (v.Length == 0) continue;
                v = v.Replace("\r", "");
                byte[] bys;
                if (models.Basic.StrToHex(v, 0, v.Length, out bys, out msg) == false)
                {
                    MessageBox.Show(msg);
                    return;
                }
                for (int ii = 0; ii < bys.Length - 18; ii++)
                {
                    byte[] bbys = new byte[18]; //18个先解码
                    for (int iii = 0; iii < 18; iii++)
                    {
                        bbys[iii] = bys[ii + iii];
                    }
                    Exange(key, bbys);
                    ret += models.Basic.Hex2Str(bbys, 0, bbys.Length, true) + "\r\n";
                    if (bbys[3] != 0)
                    {
                        break; ;
                    }
                    int len;
                    len = bbys[5];
                    len <<= 8;
                    len |= bbys[4];
                    bbys = new byte[len]; //18个先解码
                    if ((ii + 18 + len) > bys.Length) continue;

                    for (int iii = 0; iii < len; iii++)
                    {
                        bbys[iii] = bys[ii + iii + 18];
                    }
                    Exange(key, bbys);
                    ret += models.Basic.Hex2Str(bbys, 0, bbys.Length, true) + "\r\n";
                    ii += 18 + len - 1;
                }
            }
            txtOutCmd.Text = ret;
            sp = ret.Split('\n');
            ret = "";
            foreach (string s0 in sp)
            {
                byte[] bys;
                if (models.Basic.StrToHex(s0, 0, s0.Length - 1, out bys, out msg) == false)
                {
                    continue;
                }
                for (int i = 0; i < bys.Length; i++)
                {
                    if (bys[i] > 0x80)
                    {
                        i++;
                        continue;
                    }
                    else if (bys[i] < 32)
                    {
                        bys[i] = 42;
                    }
                }
                ret += System.Text.Encoding.Default.GetString(bys) + "\r\n";
            }
            txtAscii.Text = ret;
        }
        //获取KEY
        private byte[] GetKey(string s, byte[] ret)
        {
            byte[] bys = System.Text.Encoding.Default.GetBytes(s);
            int tmlen = bys.Length;                                         //获取长度
            byte temp1, temp2, temp3, temp4;
            temp1 = temp2 = temp3 = temp4 = 0;

            for (int i = 0; i < ret.Length; i++)
            {
                ret[i] = (byte)i;
            }
            for (int i = 0; i < ret.Length; i++)
            {
                temp1 = bys[i % tmlen];   //秘钥
                temp2 = ret[i];                //key

                temp3 = (byte)(temp1 + temp3 + temp2); //计算偏移值
                temp4 = ret[temp3];//读取偏移后数据

                ret[i] = temp4;
                ret[temp3] = temp2;
            }
            return ret;
        }
        //解码
        private void Exange(string key, byte[] p) //加解密函数 调用这个即可 数组指针 长度
        {
            byte temp1, temp2, temp3, temp4;
            temp1 = temp2 = temp3 = temp4 = 0;
            byte[] KEY = new byte[256];
            GetKey(key, KEY);
            for (int i = 0; i < p.Length; i++)
            {
                temp1 = KEY[(i + 1) % 256];
                temp3 = (byte)(temp1 + temp3);//保存变量
                temp2 = KEY[temp3];

                KEY[(i + 1) % 256] = temp2;
                KEY[temp3] = temp1;
                temp2 = (byte)(temp1 + temp2);
                temp1 = KEY[temp2];
                temp4 = p[i];
                temp4 = (byte)(temp4 ^ temp1);
                p[i] = temp4;
            }
        }

        private void btn解密_Click(object sender, EventArgs e)
        {
            string msg;
            string s = txtOutCmd.Text;
            string[] sp = s.Split('\n');
            string ret = sp[0] + "\r\n";
            for (int i = 1; i < sp.Length; i++)
            {
                string v = sp[i];
                if (v.Length == 0) continue;
                v = v.Replace("\r", "");
                byte[] bys;
                if (models.Basic.StrToHex(v, 0, v.Length, out bys, out msg) == false)
                {
                    MessageBox.Show(msg);
                    return;
                }
                Exange(key, bys);
                ret += models.Basic.Hex2Str(bys, 0, bys.Length, true) + "\r\n";
            }
            txtOutCmd.Text = ret;
            sp = ret.Split('\n');
            ret = "";
            foreach (string s0 in sp)
            {
                byte[] bys;
                if (models.Basic.StrToHex(s0, 0, s0.Length - 1, out bys, out msg) == false)
                {
                    continue;
                }
                for (int i = 0; i < bys.Length; i++)
                {
                    if (bys[i] > 0x80)
                    {
                        i++;
                        continue;
                    }
                    else if (bys[i] < 32)
                    {
                        bys[i] = 42;
                    }
                }
                ret += System.Text.Encoding.Default.GetString(bys) + "\r\n";
            }
            txtAscii.Text = ret;
        }

        private void btn查看数据内容_Click(object sender, EventArgs e)
        {
            string msg;
            string s = txtOutCmd.Text;
            string[] sp = s.Split('\n');
            string ret = sp[0] + "\r\n";
            for (int i = 1; i < sp.Length; i++)
            {
                string v = sp[i];
                if (v.Length == 0) continue;
                v = v.Replace("\r", "");
                byte[] bys;
                if (models.Basic.StrToHex(v, 0, v.Length, out bys, out msg) == false)
                {
                    MessageBox.Show(msg);
                    return;
                }
                Exange(key, bys);
                ret += models.Basic.Hex2Str(bys, 0, bys.Length, true) + "\r\n";
            }
            txtOutCmd.Text = ret;
            sp = ret.Split('\n');
            ret = "";
            foreach (string s0 in sp)
            {
                byte[] bys;
                if (models.Basic.StrToHex(s0, 0, s0.Length - 1, out bys, out msg) == false)
                {
                    continue;
                }
                for (int i = 0; i < bys.Length; i++)
                {
                    if (bys[i] > 0x80)
                    {
                        i++;
                        continue;
                    }
                    else if (bys[i] < 32)
                    {
                        bys[i] = 42;
                    }
                }
                ret += System.Text.Encoding.Default.GetString(bys) + "\r\n";
            }
            txtAscii.Text = ret;
        }

        private void button7_Click_1(object sender, EventArgs e)
        {
            string s = txtCommand.Text;
            string[] sp = s.Split('\n');
            StringBuilder ostr = new StringBuilder();
            for(int i=0;i<sp.Length;i++)
            {
                if (sp[i].Length < 4)
                {
                    ostr.Append("\r\n");
                    continue;
                }                    
                sp[i] = sp[i].Replace("  ", "#");
                string[] sp1 = sp[i].Split('#');
                ostr.Append(sp1[1]+" ");
            }
            txtOutCmd.Text = ostr.ToString();
        }
        DataTable dt_数据分析;
        //导入
        private void button9_Click(object sender, EventArgs e)
        {
            string txt = richTextBox1.Text;
            string[] sptxt = txt.Split('\n');
            dt_数据分析 = new DataTable();
            dt_数据分析.Columns.Add("name");
            dt_数据分析.Columns.Add("ClassName");
            dt_数据分析.Columns.Add("CollisionHeight");
            dt_数据分析.Columns.Add("CollisionRadius");

            for (int i = 0; i < sptxt.Length; i++)
            {
                string text = sptxt[i];
                text = text.Replace("\r", "");
                if (text.Length < 10) continue;
                if (text.Substring(0, 2) == "//") continue;
                if (text.Substring(0, 1) == "[") continue;
                text = text.Substring(7, text.Length - 8); //得到属性
                string[] sp = text.Split(',');
                DataRow dr = dt_数据分析.NewRow();
                for(int ii = 0; ii < sp.Length; ii++)
                {
                    string [] spt = sp[ii].Split('=');
                    switch (spt[0])
                    {
                        case "Name":
                            dr["name"] = spt[1].Replace("\"", "");
                            break;
                        case "ClassName":
                            dr["ClassName"] = spt[1].Replace("\"","");
                            break;
                        case "CollisionHeight":
                            dr["CollisionHeight"] = spt[1];
                            break;
                        case "CollisionRadius":
                            dr["CollisionRadius"] = spt[1];
                            break;
                        default:
                            break;
                    }
                }
                dt_数据分析.Rows.Add(dr);
            }
            MySqlConnection conn = new MySqlConnection(connectStr);
            try
            {
                conn.Open();
                string sql;
                MySqlDataAdapter da ;
                DataTable dt;

                for (int i = 0; i < dt_数据分析.Rows.Count; i++)
                {
                    DataRow dr = dt_数据分析.Rows[i];
                    switch (dr["ClassName"].ToString().ToLower())
                    {
                        case "sephiroth.attachment": //物品
                        case "sephiroth.bow": //弓
                        case "sephiroth.crossbow"://弩
                            sql = "SELECT * FROM 物品信息 WHERE 外观3D='"+ dr["Name"].ToString() + "'";
                            da = new MySqlDataAdapter(sql, conn);
                            dt = new DataTable();
                            da.Fill(dt);
                            if (dt.Rows.Count != 0) continue;

                            int 物品信息最小ID;
                            sql = "SELECT * FROM 物品信息 ORDER BY id asc limit 1";
                            da = new MySqlDataAdapter(sql, conn);
                            dt = new DataTable();
                            da.Fill(dt);
                            物品信息最小ID = int.Parse(dt.Rows[0]["id"].ToString()) - 1;

                            models.物品信息 物品信息 = new models.物品信息();
                            物品信息.外观3D = dr["Name"].ToString();
                            物品信息.外观2D = 物品信息.外观3D;
                            物品信息.类型 = "Etc";
                            物品信息.等级 = 100;
                            物品信息.数量 = false;
                            物品信息.持久开关1 = 33;
                            物品信息.宽度 = 5; //默认都是5*5
                            物品信息.高度 = 5;
                            物品信息.英文名称= 物品信息.外观3D;
                            物品信息.新建(connectStr, 物品信息最小ID);

                            //在物品列表里创建这个物品
                            models.物品列表 物品列表 = new models.物品列表();
                            int 物品列表最小ID;
                            sql = "SELECT * FROM 物品列表 ORDER BY id asc limit 1";
                            da = new MySqlDataAdapter(sql, conn);
                            dt = new DataTable();
                            da.Fill(dt);
                            物品列表最小ID = int.Parse(dt.Rows[0]["id"].ToString()) - 1;
                            物品列表.信息ID = 物品信息最小ID;
                            物品列表.可否交易 = true;
                            物品列表.修理价格 = -1;
                            物品列表.售价 = 999999999;
                            物品列表.当前耐久 = -1;
                            物品列表.总耐久 = -1;
                            物品列表.数量 = 0;
                            物品列表.中文名称 = 物品信息.外观3D;
                            物品列表.新建物品(connectStr, 物品列表最小ID);

                            break;
                        case "sephiroth.monster": //未知
                            break;
                        case "sephiroth.npc":
                            sql = "SELECT * FROM npc列表 WHERE 英文名称='" + dr["Name"].ToString() + "'";
                            da = new MySqlDataAdapter(sql, conn);
                            dt = new DataTable();
                            da.Fill(dt);
                            if (dt.Rows.Count != 0) continue;
                            models.NPC列表 npc = new models.NPC列表();
                            npc.中文名称 = dr["Name"].ToString();
                            npc.英文名称 = npc.中文名称;
                            npc.X = 22923;
                            npc.Y = 28436;
                            npc.大小 = 1;
                            npc.新建NPC(connectStr);
                            break;
                        case "sephiroth.hair": //头发
                            break;
                        case "sephiroth.wings"://未知
                            break;
                        case "sephiroth.robe"://未知 可能是法衣
                            break;
                        case "sephiroth.matchstone": //未知
                            break;
                        default:
                            break;
                    }
                }
            }
            catch(Exception ex)
            {

            }
            return;
        }
        //导入所有技能书
        private void button10_Click(object sender, EventArgs e)
        {

        }
        //导入技能书
        private void button11_Click(object sender, EventArgs e)
        {
            models.物品信息 物品信息模板=null;
            models.物品列表 物品列表模板 =null;
            for(int i = 0; i < m_物品信息.Length; i++)
            {
                if (m_物品信息[i].外观3D != "SecondSkillBook_purple") continue;
                物品信息模板 = m_物品信息[i];
            }
            for (int i = 0; i < m_物品列表.Length; i++)
            {
                if (m_物品列表[i].信息ID != 物品信息模板.Id) continue;
                物品列表模板 = m_物品列表[i];
            }
            if ((物品信息模板==null) || (物品列表模板 == null))
            {
                MessageBox.Show("参考物品信息出错");
                return;
            }
            string sql;
            MySqlDataAdapter da;
            DataTable dt;
            
            int 物品信息最小ID;
            sql= "SELECT * FROM 物品信息 ORDER BY id asc limit 1";
            da = new MySqlDataAdapter(sql, connectStr);
            dt = new DataTable();
            da.Fill(dt);
            物品信息最小ID = int.Parse(dt.Rows[0]["id"].ToString()) - 1;

            int 物品列表最小ID;
            sql = "SELECT * FROM 物品列表 ORDER BY id asc limit 1";
            da = new MySqlDataAdapter(sql, connectStr);
            dt = new DataTable();
            da.Fill(dt);
            物品列表最小ID = int.Parse(dt.Rows[0]["id"].ToString()) - 1;

            for (int i=0;i< m_技能信息.Length; i++)
            {
                if (m_技能信息[i].技能等级 != "高阶技能") continue;
                for(int ii = 1; ii <= 20; ii++)
                {
                    物品信息模板.等级 = ii;
                    物品信息模板.英文名称 = m_技能信息[i].技能中文名;
                    物品信息模板.脚本 = "/学习技能 " + m_技能信息[i].技能英文名 + " " + (ii-1).ToString();
                    物品信息模板.备注= m_技能信息[i].技能中文名 + "技能书[" + ii.ToString() + "级]";
                    物品信息模板.新建(connectStr, 物品信息最小ID);

                    物品列表模板.中文名称 = m_技能信息[i].技能中文名 + "技能书[" + ii.ToString() + "级]";
                    物品列表模板.信息ID = 物品信息最小ID--;

                    物品列表模板.新建物品(connectStr, 物品列表最小ID--);
                }
                
            }
            
        }
    }
}
